﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Data.SqlClient;
using System.Linq.Expressions;
using System.Data;
using System.Transactions;
using System.Text;
using DAL;
using System.ComponentModel;
using UtilityExtensions;


using System.Data.SqlClient;
using System.Data.OleDb;
 

namespace BOL
{
    [Serializable]
    public class InsumoBL
    {

        #region "CRUD"
        //public int add(string descripcion,
        //    string codigo,
        //    short nivel,
        //    int? idPadre,
        //    int? idUnidad,
        //    bool bitConstrolStock,
        //    int idtipoInsumo,
        //    DataSet entityList)
        //{

        //    using (TransactionScope ts = new TransactionScope())
        //    {

        //        DataSet dsDiferencias = new DataSet();
        //        dbGestionDataContext _db =
        //            new dbGestionDataContext(Parametros.strConnString);

        //        Insumo db = new Insumo();
        //        //verificamos que el recurso ya existe
        //        var q = from a in _db.view_recursoDisponible
        //                where a.descripcion.Trim().ToUpper() == descripcion.Trim().ToUpper()
        //                select a;

        //        if (q.Count() > 0)
        //        {
        //            throw new Exception("Insumo se encuetra registrado, Verifique");
        //        }

        //        if (idUnidad == 0)
        //        {
        //            if (nivel==2)
        //            {
        //            throw new Exception("Ingrese Unidad  del Insumo");
        //            }
        //            idUnidad = null;
        //        }

        //        int idEmpleadoEmisor = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());


        //        db.Add(_db,
        //            codigo,
        //            descripcion,
        //            idUnidad,
        //            nivel,
        //            idPadre,
        //            bitConstrolStock,
        //            idEmpleadoEmisor,
        //            "",
        //            idtipoInsumo);




        //        if (entityList.HasChanges())
        //        {
        //            dsDiferencias.Merge(entityList.GetChanges());

        //            foreach (DataRow drw in dsDiferencias.Tables[0].Rows)
        //            {


        //                //if (drw.RowState == DataRowState.Added)
        //                //{
        //                //    RecursoAdicion r = new RecursoAdicion();

        //                //    r.idInsumo = db.idInternal;
        //                //    r.idInternal = drw.Field<Int32>("idInsumo");

        //                //    r.descripcion = drw.Field<string>("descripcion");
        //                //    r.unidad = drw.Field<string>("unidad");
        //                //    r.grupo = drw.Field<string>("grupo");
        //                //    r.cantidad = drw.Field<decimal>("cantidad");
        //                //    r.precio = drw.Field<decimal>("precio");
        //                //    r.parcial = drw.Field<decimal>("parcial");



        //                //    _db.RecursosAdicion.InsertOnSubmit(r);
        //                //}

        //            }
        //            _db.SubmitChanges();

        //        }
        //        ts.Complete();
        //        return db.idInternal;
        //    }
        //}

        public int addClase(string descripcion,
            string codigo,
            string cuenta,
            bool revisado)
            {

            using (TransactionScope ts = new TransactionScope())
            {

                DataSet dsDiferencias = new DataSet();
                dbGestionDataContext _db =
                    new dbGestionDataContext(Parametros.strConnString);

                int idEmpleadoEmisor = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());
                //--------------------
                bool acceso = new FormularioAcceso().VerificarAcceso(_db,
                    idEmpleadoEmisor,
                    10,
                     2);
                //-------------------------     



                Insumo db = new Insumo();
                //verificamos que el recurso ya existe
                var q = from a in _db.Insumos
                        where a.descripcion.Trim().ToUpper() == descripcion.Trim().ToUpper()
                        select a;

                if (q.Count() > 0)
                {
                    throw new Exception("Insumo se encuetra registrado, Verifique");
                }

                

                bool? controlStock=false;

                db.Add(_db,
                    codigo,
                    descripcion,
                    null,
                    0,
                    null,
                    controlStock,
                    idEmpleadoEmisor,
                    "",
                    cuenta, revisado);

                    _db.SubmitChanges();

                
                ts.Complete();
                return db.idInternal;
            }
        }

        public int addFamilia(string descripcion,
           string codigo,
           int idPadre,
            string cuenta,
            bool bitRec
           )
        {

            using (TransactionScope ts = new TransactionScope())
            {

                DataSet dsDiferencias = new DataSet();
                dbGestionDataContext _db =
                    new dbGestionDataContext(Parametros.strConnString);



                int idEmpleadoEmisor = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());
                //--------------------
                bool acceso = new FormularioAcceso().VerificarAcceso(_db,
                    idEmpleadoEmisor,
                    10,
                     2);
                //-------------------------  

                Insumo db = new Insumo();
                //verificamos que el recurso ya existe
                var q = from a in _db.Insumos
                        where a.descripcion.Trim().ToUpper() == descripcion.Trim().ToUpper()
                        select a;

                if (q.Count() > 0)
                {
                    throw new Exception("Insumo se encuetra registrado, Verifique");
                }

                


                db.Add(_db,
                    codigo,
                    descripcion,
                    null,
                    1,
                    idPadre,
                    false,
                    idEmpleadoEmisor,
                    "",
                    cuenta,
                    bitRec);

                _db.SubmitChanges();


                ts.Complete();
                return db.idInternal;
            }
        }

        public int addsubFamilia(string descripcion,
         string codigo,
           int idPadre,
          string cuenta,
          bool bitRec
         )
        {

            using (TransactionScope ts = new TransactionScope())
            {

                DataSet dsDiferencias = new DataSet();
                dbGestionDataContext _db =
                    new dbGestionDataContext(Parametros.strConnString);

                Insumo db = new Insumo();
                //verificamos que el recurso ya existe
                var q = from a in _db.Insumos
                        where a.descripcion.Trim().ToUpper() == descripcion.Trim().ToUpper()
                        select a;

                if (q.Count() > 0)
                {
                    throw new Exception("Insumo se encuetra registrado, Verifique");
                }

                int idEmpleadoEmisor = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());


                db.Add(_db,
                    codigo,
                    descripcion,
                    null,
                    2,
                    idPadre,
                    false,
                    idEmpleadoEmisor,
                    "",
                    cuenta,
                    bitRec);

                _db.SubmitChanges();


                ts.Complete();
                return db.idInternal;
            }
        }

        public int addInsumo(string descripcion,
             string codigo,
               bool bitRec,
            int idPadre,
            int idUnidad,
            bool controlStock

            
        )
        {

            using (TransactionScope ts = new TransactionScope())
            {

                DataSet dsDiferencias = new DataSet();
                dbGestionDataContext _db =
                    new dbGestionDataContext(Parametros.strConnString);
                int idEmpleadoEmisor = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());
                //--------------------
                bool acceso = new FormularioAcceso().VerificarAcceso(_db,
                    idEmpleadoEmisor,
                    10,
                     2);
                //-------------------------  
                Insumo db = new Insumo();
                //verificamos que el recurso ya existe
                var q = from a in _db.Insumos
                        where a.descripcion.Trim().ToUpper() == descripcion.Trim().ToUpper()
                        select a;

                if (q.Count() > 0)
                {
                    throw new Exception("Insumo se encuetra registrado, Verifique");
                }

                var w = from a in _db.Insumos
                        where a.codigo.Trim().ToUpper() == codigo.Trim().ToUpper()
                        select a;

                if (w.Count() > 0)
                {
                    throw new Exception("Insumo se encuetra registrado, Verifique Codigo");
                }

                


                db.Add(_db,
                    codigo,
                    descripcion,
                    idUnidad,
                    3,
                    idPadre,
                    controlStock,
                    idEmpleadoEmisor,
                    "",
                    "",
                    bitRec
                    );

                _db.SubmitChanges();
                
                ts.Complete();
                return db.idInternal;
            }
        }

        //public bool update(int idInsumo,
        //                    string descripcion,
        //                        string codigo,
        //                        short nivel,
        //                        int? idPadre,
        //                        int idUnidad,
        //                        bool bitConstrolStock,
        //                        string cuenta,
        //                        bool? bitRec, 
        //                        DataSet entityList)
        //{
        //    bool result = false;
        //    using (TransactionScope ts = new TransactionScope())
        //    {
        //        DataSet dsDiferencias = new DataSet();

        //        dbGestionDataContext _db =
        //            new dbGestionDataContext(Parametros.strConnString);


        //        int? idEmpleadoEmisor = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());

                



        //        Insumo db = _db.Insumos.Single(p => p.idInternal==idInsumo);

        //        int? _idUnidad;

        //            if (idUnidad != 0) 
        //                _idUnidad=idUnidad ;
        //            else
        //                _idUnidad=null;


        //        // no puede cambiar la clase  ni la familia si existe hijos del insumo

                  
        //                if (db.idPadre!=idPadre)
        //                {
        //                    var q=_db.Insumos.Where(p=>p.idPadre==db.idInternal);
        //                    if (q.Count()>0)
        //                    {
        //                        throw new Exception(string.Format("No puede cambiar el Codigo:{0} a codigo:{1} si existe insumos registrados que dependen de este",db.codigo,codigo));
        //                    }
        //                }
                        
                  


               
        //        db.Update(_db,
        //            codigo,
        //            descripcion,
        //            _idUnidad,
        //            nivel,
        //            idPadre,
        //            bitConstrolStock,
        //            idEmpleadoEmisor.Value,
        //            cuenta,
        //            bitRec);
                


        //        ts.Complete();
        //        result = true;
        //    }
        //    return result;
        //}

        public bool updateClase(int idInsumo,
                              string descripcion,
                               string codigo,
                               string cuenta,
                               bool? bitRec
                               )
        {
            bool result = false;
            using (TransactionScope ts = new TransactionScope())
            {
                DataSet dsDiferencias = new DataSet();

                dbGestionDataContext _db =
                    new dbGestionDataContext(Parametros.strConnString);


                int? idEmpleadoEmisor = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());
                
                //--------------------
                bool acceso = new FormularioAcceso().VerificarAcceso(_db,
                    idEmpleadoEmisor.Value,
                    10,
                     3);
                //-------------------------  

                Insumo db = _db.Insumos.Single(p => p.idInternal == idInsumo);

                db.Update(_db,
                    codigo,
                    descripcion,
                    null,
                    0,
                    null,
                    false,
                    idEmpleadoEmisor.Value,
                    cuenta,
                    bitRec);



                ts.Complete();
                result = true;
            }
            return result;
        }


        public bool updateFamilia(int idInsumo,
                              string descripcion,
                               string codigo,
                               string cuenta,
                               bool? bitRec,
                                int idPadre
                               )
        {
            bool result = false;
            using (TransactionScope ts = new TransactionScope())
            {
                DataSet dsDiferencias = new DataSet();

                dbGestionDataContext _db =
                    new dbGestionDataContext(Parametros.strConnString);


                int? idEmpleadoEmisor = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());
                
                //--------------------
                bool acceso = new FormularioAcceso().VerificarAcceso(_db,
                    idEmpleadoEmisor.Value,
                    10,
                     3);
                //-------------------------  

                Insumo db = _db.Insumos.Single(p => p.idInternal == idInsumo);

                db.Update(_db,
                    codigo,
                    descripcion,
                    null,
                    1,
                    idPadre,
                    false,
                    idEmpleadoEmisor.Value,
                    cuenta,
                    bitRec);



                ts.Complete();
                result = true;
            }
            return result;
        }


        public bool updateSubFamilia(int idInsumo,
                            string descripcion,
                             string codigo,
                             string cuenta,
                             bool? bitRec,
                             int idPadre
                               )
        {
            bool result = false;
            using (TransactionScope ts = new TransactionScope())
            {
                DataSet dsDiferencias = new DataSet();

                dbGestionDataContext _db =
                    new dbGestionDataContext(Parametros.strConnString);


                int? idEmpleadoEmisor = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());
                
                //--------------------
                bool acceso = new FormularioAcceso().VerificarAcceso(_db,
                    idEmpleadoEmisor.Value,
                    10,
                     2);
                //-------------------------  

                Insumo db = _db.Insumos.Single(p => p.idInternal == idInsumo);

                db.Update(_db,
                    codigo,
                    descripcion,
                    null,
                    2,
                    idPadre,
                    false,
                    idEmpleadoEmisor.Value,
                    cuenta,
                    bitRec
                    );



                ts.Complete();
                result = true;
            }
            return result;
        }



        public bool updateinsumo(int idInsumo,
                           string descripcion,
                            string codigo,
                            bool bitControlStock,
                            int idunidad,
                            bool? bitRec,
                            int idPadre
           )
        {
            bool result = false;
            using (TransactionScope ts = new TransactionScope())
            {
                DataSet dsDiferencias = new DataSet();

                dbGestionDataContext _db =
                    new dbGestionDataContext(Parametros.strConnString);


                int? idEmpleadoEmisor = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());

                
                //--------------------
                bool acceso = new FormularioAcceso().VerificarAcceso(_db,
                    idEmpleadoEmisor.Value,
                    10,
                     3);
                //-------------------------  
                Insumo db = _db.Insumos.Single(p => p.idInternal == idInsumo);

                db.Update(_db,
                    codigo,
                    descripcion,
                    idunidad,
                    3,
                    idPadre,
                    bitControlStock,
                    idEmpleadoEmisor.Value,
                    "",
                    bitRec);



                ts.Complete();
                result = true;
            }
            return result;
        }

        public bool delete(int idInsumo)
        {

            bool result = false;
            using (TransactionScope ts = new TransactionScope())
            {

                dbGestionDataContext _db;
                _db = new dbGestionDataContext(Parametros.strConnString);

              
                Insumo insumo = _db.Insumos.Single(p => p.idInternal == idInsumo);


                int idEmpleadoEmisor = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());
                //--------------------
                bool acceso = new FormularioAcceso().VerificarAcceso(_db,
                    idEmpleadoEmisor,
                    10,
                     4);
                //-------------------------  

                var q= (from a in _db.Recursos
                       where a.idInsumo==idInsumo
                       select a).Count();

                if (q>0)
                {
                    throw new Exception("El insumo se encuentra en Presupuesto");
                }
                var qq= (from a in _db.EstructuraCostoItems
                       where a.idInsumo==idInsumo
                       select a).Count();

                if (qq > 0)
                {
                    throw new Exception("El insumo se encuentra en Estructura de Compras");
                }

                _db.Insumos.DeleteOnSubmit(insumo);
                _db.SubmitChanges();
                ts.Complete();
                result = true;
            }
            return result;

        }


        public bool updateInsumoNivel()
        {
            //verificar los nivel para la greacion de  grupos


            bool result = false;


            dbS10DataContext _dbs10 = new dbS10DataContext(Parametros.strConnString);


            var q0 = from i in _dbs10.InsumoS10
                     where i.Nivel == 0
                     select i;

            //_dbs10 = null;

            //using (TransactionScope ts = new TransactionScope())
            //{
            foreach (var item in q0)
            {
                dbGestionDataContext _dbGestion = new dbGestionDataContext(Parametros.strConnString);

                var p0 = from a in _dbGestion.Insumos
                         where a.codigo.Trim() == item.CodInsumo.Trim()
                         select a;
                if (p0.Count() > 0)
                {
                    // encontrado
                    p0.First().descripcion = item.Descripcion;
                    p0.First().nivel = 0;
                    //p0.First().unidad = item.UnidadS10.Descripcion;
                    //p0.First().codUnidad = item.CodUnidad;
                }
                else
                {
                    // nuevo
                    Insumo insumo = new Insumo();
                    insumo.codigo = item.CodInsumo;
                    insumo.descripcion = item.Descripcion;
                    //insumo.idPadre = 0; para ser controlado por la relacion db
                    insumo.fechaCreacion = DateTime.Now;
                    //insumo.unidad = item.UnidadS10.Descripcion;
                    insumo.nivel = 0;
                    // insumo.codUnidad = item.CodUnidad;

                    _dbGestion.Insumos.InsertOnSubmit(insumo);
                }
                _dbGestion.SubmitChanges();

            }

            //  ts.Complete();

            //}
            //nivel 1

            var q1 = from i in _dbs10.InsumoS10
                     where i.Nivel == 1
                     select i;

            // using (TransactionScope ts1 = new TransactionScope())
            // {
            foreach (var item in q1)
            {
                dbGestionDataContext _dbGestion = new dbGestionDataContext(Parametros.strConnString);

                var p1 = from a in _dbGestion.Insumos
                         where a.codigo.Trim() == item.CodInsumo.Trim()
                         select a;
                if (p1.Count() > 0)
                {
                    // encontrado
                    p1.First().descripcion = item.Descripcion;
                    p1.First().nivel = 1;
                    //p1.First().unidad = item.UnidadS10.Descripcion;
                    //p1.First().codUnidad = item.CodUnidad;
                }
                else
                {
                    // nuevo
                    var a1 = from a in _dbGestion.Insumos
                             where a.codigo.Trim() == item.CodInsumo.Substring(0, 2) && a.nivel == 0
                             select a;
                    if (a1.Count() > 0)
                    {
                        Insumo insumo = new Insumo();
                        insumo.codigo = item.CodInsumo;
                        insumo.descripcion = item.Descripcion;


                        insumo.idPadre = a1.First().idInternal;
                        insumo.fechaCreacion = DateTime.Now;
                        //insumo.unidad = item.UnidadS10.Descripcion;
                        insumo.nivel = 1;
                        //insumo.codUnidad = item.CodUnidad;

                        _dbGestion.Insumos.InsertOnSubmit(insumo);
                    }
                }
                _dbGestion.SubmitChanges();

            }
            //   ts1.Complete();
            //}
            //nivel 2
            var q2 = from i in _dbs10.InsumoS10
                     where i.Nivel == 2
                     select i;
            //using (TransactionScope ts2 = new TransactionScope())
            //{

            foreach (var item in q2)
            {
                dbGestionDataContext _dbGestion = new dbGestionDataContext(Parametros.strConnString);

                var p2 = from a in _dbGestion.Insumos
                         where a.codigo.Trim() == item.CodInsumo.Trim()
                         select a;

                if (p2.Count() > 0)
                {
                    // encontrado
                    p2.First().descripcion = item.Descripcion;
                    p2.First().nivel = 2;
                    //p2.First().unidad = item.UnidadS10.Descripcion;
                    //p2.First().codUnidad = item.CodUnidad;
                }
                else
                {
                    // nuevo
                    var a2 = from a in _dbGestion.Insumos
                             where a.codigo == item.CodInsumo.Substring(0, 4) && a.nivel == 1
                             select a;
                    if (a2.Count() > 0)
                    {
                        Insumo insumo = new Insumo();
                        insumo.codigo = item.CodInsumo;
                        insumo.descripcion = item.Descripcion;

                        insumo.idPadre = a2.First().idInternal;
                        insumo.fechaCreacion = DateTime.Now;
                        //insumo.unidad=item.UnidadS10.Descripcion;
                        insumo.nivel = 2;
                        //insumo.codUnidad=item.CodUnidad;

                        _dbGestion.Insumos.InsertOnSubmit(insumo);
                    }
                }
                _dbGestion.SubmitChanges();


            }

            //ts2.Complete();
            result = true;
            //}
            return result;



        }


        public InsumoInfo Load(int idInsumo)
        {

            var q = from a in DbUtil.Db.Insumos
                         join b in DbUtil.Db.Insumos on a.idPadre equals b.idInternal into viewinsumo
                         from c in viewinsumo.DefaultIfEmpty()
                         where a.idInternal==idInsumo
                         select new InsumoInfo
                       {
                        bitControlStock=a.bitControlStock.Value,
                        bitRec=a.bitRec,
                        codigo=a.codigo,
                        descripcion=a.descripcion,
                        fechaCre=a.fechaCreacion.Value,
                        fechaMod=a.fechaMod.Value,
                        idInternal=a.idInternal,
                        idPadre=a.idPadre,
                        nivel=a.nivel.Value,
                        idunidad=a.idunidad,
                        unidad=a.InsumoUnidad.abreviacion,
                        empleadoCre=a.Empleado.descripcion,
                        empleadoMod=a.Empleado1.descripcion,
                        insumoPadre=c.descripcion,
                        codigoPadre=c.codigo,
                        cuenta=a.cuenta,
                        codigoS10=a.codS10
                       };

            
            return q.First();
        }

        #endregion


        public Insumo getInsumoFromCod(string codigo)
        {

            //codigo.Spli
            Insumo insumo = null;

            // primero buscamos el isumo por descripcion
           
                var qq = from a in DbUtil.Db.Insumos
                         where a.codigo.Trim() == codigo.Trim()
                         select a;
                if (qq.Count() > 0)
                {
                    insumo = qq.First();
                }

          

            return insumo;
        }

        public Insumo getInsumoFromCodigoS10(string descripcion, string codigos10)
        {

            //codigo.Spli
            Insumo insumo = null;

            // primero buscamos el isumo por descripcion
            var q = from a in DbUtil.Db.Insumos
                    where a.descripcion.ToUpper().Trim() == descripcion.ToUpper().Trim()
                    & a.nivel == 3
                    select a;

            if (q.Count() > 0)
            {
                insumo = q.First();
            }
            else
            {
                var qq = from a in DbUtil.Db.Insumos
                         where a.codS10.Trim() == codigos10.Trim()
                         select a;
                if (qq.Count() > 0)
                {
                    insumo = qq.First();
                }

            }

            return insumo;
        }

        public InsumoUnidad getInsumoUnidadFromAbrev(string Abreviacion)
        {

            //codigo.Spli
            InsumoUnidad insumo = null;
            var q = from a in DbUtil.Db.InsumoUnidad
                    where a.abreviacion.Trim().ToUpper() == Abreviacion.Trim().ToUpper()
                    select a;
            if (q.Count() > 0)
            {
                insumo = q.First();
            }

            return insumo;
        }
        
        private string ReadCelda(ref Microsoft.Office.Interop.Excel.Worksheet sheet, string cell)
        {
            Microsoft.Office.Interop.Excel.Range range = sheet.get_Range(cell, cell);
            if (range.Value2 != null)
                return range.Value2.ToString();
            else
                return "";
        }

        //public bool addInsumoFromList(IQueryable<string> codigoList, List<Insumo> insumoList)
        //{

        //    bool result = false;

        //    dbGestionDataContext _db;


        //    using (TransactionScope ts = new TransactionScope())
        //    {
        //        _db = new
        //       dbGestionDataContext(Parametros.strConnString);

        //        Insumo insumodb;

        //        foreach (string insumoExcel in codigoList)
        //        {

        //            //busqueda para actualizar
        //            var i = from a in _db.Insumos
        //                    where a.codS10 == insumoExcel
        //                    select a;

        //            var coleccion = from d in insumoList
        //                            where d.codS10 == insumoExcel
        //                            select d;
        //            Insumo insumocol = coleccion.First();

        //            if (i.Count() > 0)
        //            {
        //                //encontrado
        //                insumodb = i.First();
        //                // en caso que cambio lo actualizamos

        //                insumodb.descripcion = insumocol.descripcion;
        //                insumodb.idunidad = insumocol.idunidad;

        //            }
        //            else
        //            {
        //                //insertar si no existe
        //                // el codigo debe  de estar registrado Grupo
        //                var grupo = from a in _db.Insumos
        //                            where a.codigo.Trim() == insumocol.codS10.Substring(0, 6)
        //                            select a;
        //                if (grupo.Count() > 0)
        //                {
        //                    //solo registro el insumo
        //                    insumodb = new Insumo();
        //                    insumodb.descripcion = insumocol.descripcion;
        //                    insumodb.idPadre = grupo.First().idInternal;
        //                    insumodb.fechaCreacion = DateTime.Now;
        //                    insumodb.nivel = 3;
        //                    insumodb.idunidad = insumocol.idunidad;
        //                    insumodb.codS10 = insumocol.codS10;
        //                    insumodb.codigo = insumodb.getCorrelativo(_db, insumoExcel.Substring(0, 6), 3);
        //                    _db.Insumos.InsertOnSubmit(insumodb);
        //                    _db.SubmitChanges();
        //                }
        //                else
        //                {
        //                    // para el caso que el grupo no esta registrado
        //                    throw new Exception("Verificar los grupo de familia antes de ingresar el insumo:" + insumocol.descripcion + "(" + insumocol.codS10 + ")");

        //                    ////  se registra el insumo
        //                    //insumodb = new Insumo();
        //                    //insumodb.idPadre = grupo.First().idInternal;
        //                    //insumodb.descripcion = insumoExcel.descripcion;
        //                    //insumodb.unidad = insumoExcel.unidad;
        //                    //insumodb.codS10 = insumoExcel.codS10;
        //                    //insumodb.codigo = getCorrelativo(insumoExcel.codS10.Substring(0, 6), _db);
        //                    //_db.Insumo.InsertOnSubmit(insumodb);
        //                }



        //            }
        //        }
        //        ts.Complete();
        //        result = true;

        //    }
        //    return result;
        //}

        //[DataObjectMethod(DataObjectMethodType.Select, false)]
        //public string getInsumoAll(string prefixText,
        //               int count)
        //{

        //    //optenemos palabra por palabra
        //    string[] word = new string[2];

        //    string[] word2 = prefixText.Split(' ');
        //    word[0] = word2[0];
        //    word[1] = (word2.Length > 1) ? prefixText.Substring(word2[0].Length) : "";

        //    string result = "";
        //    if (word2.Length == 1)
        //    {
        //        var pp = (from a in DbUtil.Db.Insumos
        //                  where a.nivel == 3
        //                  & (a.codigo + a.descripcion).Contains(word[0])
                          

        //                  select new insumoDisponibleinfo
        //                  {

        //                      codigo = a.codigo.Trim(),
        //                      descripcion = a.descripcion.Trim(),
        //                      unidad = a.InsumoUnidad.abreviacion.Trim()
        //                  }).Take(count + 10);
        //         result=Util.Tbl2Str(Util.EntidadToDataTable(pp));
        //    }
        //    if (word2.Length > 1)
        //    {
        //        var pp = (from a in DbUtil.Db.Insumos
        //                  where a.nivel == 3
        //                  & ((a.codigo +" "+ a.descripcion).Contains(word[0])
        //                  & (a.codigo + " " + a.descripcion).Contains(word[1]))

        //                  select new insumoDisponibleinfo
        //                  {

        //                      codigo = a.codigo.Trim(),
        //                      descripcion = a.descripcion.Trim(),
        //                      unidad = a.InsumoUnidad.abreviacion.Trim()
        //                  }).Take(count + 10);

        //        result = Util.Tbl2Str(Util.EntidadToDataTable(pp));
        //    }

        //    return result;

        //}

          [DataObjectMethod(DataObjectMethodType.Select, false)]
        public string getInsumoAll(string prefixText,
                int count)
        {

            //obtenemos palabra por palabra
            string[] word = new string[5];

            string[] word2 = prefixText.Split(' ');
            word[0] = word2[0];
            word[1] = (word2.Length > 1) ? word2[1] : "";
            word[2] = (word2.Length > 2) ? word2[2] : "";
            word[3] = (word2.Length > 3) ? word2[3] : "";
            word[4] = (word2.Length > 4) ? word2[4] : "";

            string result = "";
            var pp = (from a in DbUtil.Db.Insumos
                      where a.nivel == 3
                      & ((a.codigo + " " + a.descripcion).Contains(word[0])
                      & (a.codigo + " " + a.descripcion).Contains(word[1])
                      & (a.codigo + " " + a.descripcion).Contains(word[2])
                      & (a.codigo + " " + a.descripcion).Contains(word[3])
                      & (a.codigo + " " + a.descripcion).Contains(word[4]))

                      select new insumoDisponibleinfo
                      {

                          codigo = a.codigo.Trim(),
                          descripcion = a.descripcion.Trim(),
                          unidad = a.InsumoUnidad.abreviacion.Trim()
                      }).Take(count + 10);

            result = Util.Tbl2Str(Util.EntidadToDataTable(pp));
            return result;

        }

          [DataObjectMethod(DataObjectMethodType.Select, false)]
          public string getInsumo2All(string prefixText,
                  int count)
          {

              //obtenemos palabra por palabra
              string[] word = new string[5];

              string[] word2 = prefixText.Split(' ');
              word[0] = word2[0];
              word[1] = (word2.Length > 1) ? word2[1] : "";
              word[2] = (word2.Length > 2) ? word2[2] : "";
              word[3] = (word2.Length > 3) ? word2[3] : "";
              word[4] = (word2.Length > 4) ? word2[4] : "";

              string result = "";
              var pp = (from a in DbUtil.Db.Insumos
                        where a.nivel == 3
                        & ((a.codigo + " " + a.descripcion).Contains(word[0])
                        & (a.codigo + " " + a.descripcion).Contains(word[1])
                        & (a.codigo + " " + a.descripcion).Contains(word[2])
                        & (a.codigo + " " + a.descripcion).Contains(word[3])
                        & (a.codigo + " " + a.descripcion).Contains(word[4]))

                        select new insumoDisponibleinfo
                        {
                            idInsumo=a.idInternal,
                            codigo = a.codigo.Trim(),
                            descripcion = a.descripcion.Trim(),
                            unidad = a.InsumoUnidad.abreviacion.Trim()
                        }).Take(count + 10);

              result = Util.Tbl2Str(Util.EntidadToDataTable(pp));
              return result;

          }

        [DataObjectMethod(DataObjectMethodType.Select, false)]
        public string getInsumoMovimientoAll(string prefixText,
                       int count)
        {

            //optenemos palabra por palabra
            string[] word = new string[2];

            string[] word2 = prefixText.Split(' ');
            word[0] = word2[0];
            word[1] = (word2.Length > 1) ? prefixText.Substring(word2[0].Length) : "";

            string result = "";
            if (word2.Length == 1)
            {
                    var pp = (from a in DbUtil.Db.Insumos
                          where a.nivel == 3
                          & a.bitControlStock==true
                          & (a.codigo + a.descripcion).Contains(word[0])
                          select new InsumoMovimientoInfo
                          {
                              idInternal=a.idInternal,
                              codigo = a.codigo.Trim(),
                              descripcion = a.descripcion.Trim(),
                              unidad = a.InsumoUnidad.abreviacion.Trim(),
                              familia=a.Insumo1.Insumo1.descripcion.Trim(),
                              subFamilia=a.Insumo1.descripcion.Trim(),
                          }).Take(count + 10);
                    result = Util.Tbl2Str(Util.EntidadToDataTable(pp));
            }
            if (word2.Length > 1)
            {
                var pp = (from a in DbUtil.Db.Insumos
                          where a.nivel == 3
                          & ((a.codigo + " " + a.descripcion).Contains(word[0])
                          & (a.codigo + " " + a.descripcion).Contains(word[1]))

                          select new InsumoMovimientoInfo
                          {
                              idInternal = a.idInternal,
                              codigo = a.codigo.Trim(),
                              descripcion = a.descripcion.Trim(),
                              unidad = a.InsumoUnidad.abreviacion.Trim(),
                              familia = a.Insumo1.Insumo1.descripcion.Trim(),
                              subFamilia = a.Insumo1.descripcion.Trim(),
                          }).Take(count + 10);

                result = Util.Tbl2Str(Util.EntidadToDataTable(pp));
            }

            return result;

        }

        [DataObjectMethod(DataObjectMethodType.Select, false)]
        public string getInsumoStockAll(string prefixText, int count)
        
        {
            string[] word = new string[2];
                  
         string[] word2 = prefixText.Split(' ');
         word[0] = word2[0];
         word[1] = (word2.Length > 1) ? prefixText.Substring(word2[0].Length) : "";
            string result = "";
            if (word2.Length == 1)
            {
                var p = (from a in DbUtil.Db.Insumos
                      where
                       (a.codigo + a.descripcion).Contains(word[0])
               
                      & a.nivel == 3 &
                      a.bitControlStock == true
                      select new insumoDisponibleinfo
                      {
                          codigo = a.codigo.Trim(),
                          descripcion = a.descripcion.Trim(),
                          unidad = a.InsumoUnidad.abreviacion.Trim()
                      }).Take(count);
         
            result= Util.Tbl2Str(Util.EntidadToDataTable(p));
            }



         if (word2.Length > 1)
         {

             var p = (from a in DbUtil.Db.Insumos
                      where
                       (a.codigo +" "+ a.descripcion).Contains(word[0])
                       & (a.codigo +" "+ a.descripcion).Contains(word[1])
                      & a.nivel == 3 &
                      a.bitControlStock == true
                      select new insumoDisponibleinfo
                      {
                          codigo = a.codigo.Trim(),
                          descripcion = a.descripcion.Trim(),
                          unidad = a.InsumoUnidad.abreviacion.Trim()
                      }).Take(count);

             result=Util.Tbl2Str(Util.EntidadToDataTable(p));
         }
         return result;

        }

        [DataObjectMethod(DataObjectMethodType.Select, false)]
        public string getInsumoDescripAll(string prefixText, int count)
        {


            var p = (from a in DbUtil.Db.Insumos
                     where (a.descripcion).Contains(prefixText) 
                    
                     select new DescripcionInfo
                     {
                         descripcion = a.descripcion.Trim(),
                         
                     }).Take(count);

            return Util.Tbl2Str(Util.EntidadToDataTable(p));

        }

        [DataObjectMethod(DataObjectMethodType.Select, false)]
        public string getInsumoDescripNivel3(string prefixText, int idTipoInsumo, int count)
        {


            var p = (from a in DbUtil.Db.Insumos
                     where (a.descripcion).Contains(prefixText) &
                     a.idTipoInsumo == idTipoInsumo & a.nivel==3
                     select new DescripcionInfo
                     {
                         descripcion = a.descripcion.Trim(),

                     }).Take(count);

            return Util.Tbl2Str(Util.EntidadToDataTable(p));

        }

        [DataObjectMethod(DataObjectMethodType.Select, false)]
        public List<InsumoListInfo> getInsumoListXClase(int idClase)
        {
            var q = from a in DbUtil.Db.Insumos
                    join b in DbUtil.Db.Insumos on a.idPadre equals b.idInternal into viewinsumo
                    from c in viewinsumo.DefaultIfEmpty()
                    where a.idPadre == idClase 
                    orderby a.codigo
                    select new InsumoListInfo
                    {
                        bitControlStock = a.bitControlStock,
                        bitRec = a.bitRec,
                        codigo = a.codigo,
                        descripcion = a.descripcion,
                        fechaCre = a.fechaCreacion.Value,
                        fechaMod = a.fechaMod.Value,
                        idInternal = a.idInternal,
                        idPadre = a.idPadre.Value,
                        idunidad = a.idunidad.Value,
                        unidad = a.InsumoUnidad.abreviacion,
                        empleadoCre = a.Empleado.descripcion,
                        empleadoMod = a.Empleado1.descripcion,
                        insumoPadre = c.descripcion,
                        codigoPadre = c.codigo,
                        idTipoInsumo=a.idTipoInsumo,
                        cuenta = a.cuenta
                    };

            return q.ToList();

        }


        [DataObjectMethod(DataObjectMethodType.Select, false)]
        public List<InsumoListInfo> getInsumoListXFamilia(int idfamilia)
        {
            var q = from a in DbUtil.Db.Insumos
                    join b in DbUtil.Db.Insumos on a.idPadre equals b.idInternal into viewinsumo
                    from c in viewinsumo.DefaultIfEmpty()
                    where a.idPadre==idfamilia 
                   
                    orderby a.codigo
                    select new InsumoListInfo
                    {
                        bitControlStock = a.bitControlStock.Value,
                        bitRec = a.bitRec.Value,
                        codigo = a.codigo,
                        descripcion = a.descripcion,
                        fechaCre = a.fechaCreacion.Value,
                        fechaMod = a.fechaMod.Value,
                        idInternal = a.idInternal,
                        idPadre = a.idPadre.Value,
                        idunidad = a.idunidad.Value,
                        unidad = a.InsumoUnidad.abreviacion,
                        empleadoCre = a.Empleado.descripcion,
                        empleadoMod = a.Empleado1.descripcion,
                        insumoPadre = c.descripcion,
                        codigoPadre = c.codigo,
                        idTipoInsumo=a.idTipoInsumo,
                        cuenta = a.cuenta
                    };

            return q.ToList();

        }

        [DataObjectMethod(DataObjectMethodType.Select, false)]
        public List<InsumoListInfo> getInsumoListXSubFamilia(int idsubfamilia)
        {
            var q = from a in DbUtil.Db.Insumos
                    join b in DbUtil.Db.Insumos on a.idPadre equals b.idInternal into viewinsumo
                    from c in viewinsumo.DefaultIfEmpty()
                    where a.idPadre == idsubfamilia 
                   
                    orderby a.codigo
                    select new InsumoListInfo
                    {
                        bitControlStock = a.bitControlStock.Value,
                        bitRec = a.bitRec.Value,
                        codigo = a.codigo,
                        descripcion = a.descripcion,
                        fechaCre = a.fechaCreacion.Value,
                        fechaMod = a.fechaMod.Value,
                        idInternal = a.idInternal,
                        idPadre = a.idPadre.Value,
                        idunidad = a.idunidad.Value,
                        unidad = a.InsumoUnidad.abreviacion,
                        empleadoCre = a.Empleado.descripcion,
                        empleadoMod = a.Empleado1.descripcion,
                        insumoPadre = c.descripcion,
                        codigoPadre = c.codigo,
                        idTipoInsumo = a.idTipoInsumo,
                        cuenta = a.cuenta
                    };

            return q.ToList();

        }

        
                        
        [DataObjectMethod(DataObjectMethodType.Select, false)]
        public List<InsumoListInfo> getInsumoSinClasificar(int startRowIndex, int maximumRows, string sortExpression)
        {
            var q = from a in DbUtil.Db.Insumos
                    where
                    a.idPadre == 5571
                    orderby a.codigo
                    select new InsumoListInfo
                    {
                        bitControlStock = a.bitControlStock.Value,
                        bitRec = a.bitRec.Value,
                        codigo = a.codigo,
                        fechaCre = a.fechaCreacion.Value,
                        fechaMod = a.fechaMod.Value,
                        descripcion = a.descripcion,
                        idInternal = a.idInternal,
                        empleadoCre = a.Empleado.descripcion,
                        empleadoMod = a.Empleado1.descripcion,
                        idTipoInsumo = a.idTipoInsumo,
                        cuenta = a.cuenta,
                        codigoPadre = a.Insumo1.codigo,
                        insumoPadre = a.Insumo1.descripcion,
                        unidad = a.InsumoUnidad.descripcion,
                        nivel = a.nivel.Value,
                        idunidad = a.idunidad


                    };
            _count = q.Count();
            q = ApplySort(q, sortExpression);
            return q.Skip(startRowIndex).Take(maximumRows).ToList();

        }



         public int Count(int startRowIndex, int maximumRows, string sortExpression,int idPadre)
        {
            return _count;
        }

         public int Count(int startRowIndex, int maximumRows, string sortExpression)
         {
             return _count;
         }

        [DataObjectMethod(DataObjectMethodType.Select, false)]
         public List<InsumoListInfo> getInsumoSubgrupo(int startRowIndex, int maximumRows, string sortExpression, int idPadre)
        {
            var q = from a in DbUtil.Db.Insumos
                    where
                    a.idPadre == idPadre
                    orderby a.codigo
                    select new InsumoListInfo
                    {
                        bitControlStock = a.bitControlStock.Value,
                        bitRec = a.bitRec.Value,
                        codigo = a.codigo,
                        fechaCre=a.fechaCreacion.Value,
                        fechaMod=a.fechaMod.Value,
                        descripcion = a.descripcion,
                        idInternal = a.idInternal,
                        empleadoCre = a.Empleado.descripcion,
                        empleadoMod = a.Empleado1.descripcion,
                        idTipoInsumo=a.idTipoInsumo,
                        cuenta = a.cuenta,
                        codigoPadre=a.Insumo1.codigo,
                        insumoPadre=a.Insumo1.descripcion,
                        unidad=a.InsumoUnidad.descripcion,
                        nivel=a.nivel.Value,
                        idunidad=a.idunidad
                        
                        
                    };
            _count = q.Count();
            q = ApplySort(q, sortExpression);
            return q.Skip(startRowIndex).Take(maximumRows).ToList();

        }


        //public List<InsumoListInfo> getInsumoAllfamilias(int idTipoInsumo)
        //{
        //    var q = from a in DbUtil.Db.Insumos
        //            join b in DbUtil.Db.Insumos on a.idPadre equals b.idInternal into viewinsumo
        //            from c in viewinsumo.DefaultIfEmpty()
        //            where a.nivel == 1 &
        //            a.idTipoInsumo == idTipoInsumo
        //            orderby a.codigo
        //            select new InsumoListInfo
        //            {
        //                bitControlStock = a.bitControlStock.Value,
        //                bitRec = a.bitRec.Value,
        //                codigo = a.codigo,
        //                descripcion = a.descripcion,
        //                fechaCre = a.fechaCreacion.Value,
        //                fechaMod = a.fechaMod.Value,
        //                idInternal = a.idInternal,
        //                idPadre = a.idPadre.Value,
        //                idunidad = a.idunidad.Value,
        //                unidad = a.InsumoUnidad.abreviacion,
        //                empleadoCre = a.Empleado.descripcion,
        //                empleadoMod = a.Empleado1.descripcion,
        //                insumoPadre = c.descripcion,
        //                codigoPadre = c.codigo,
        //                idTipoInsumo=a.idTipoInsumo,
        //                cuenta = a.cuenta

        //            };

        //    return q.ToList();

          

        //}


        //public List<InsumoListInfo> getInsumoAllsubfamilias(int idTipoInsumo)
        //{
        //    var q = from a in DbUtil.Db.Insumos
        //            join b in DbUtil.Db.Insumos on a.idPadre equals b.idInternal into viewinsumo
        //            from c in viewinsumo.DefaultIfEmpty()
        //            where a.nivel == 2 &
        //            a.idTipoInsumo == idTipoInsumo
        //            orderby a.codigo
        //            select new InsumoListInfo
        //            {
        //                bitControlStock = a.bitControlStock.Value,
        //                bitRec = a.bitRec.Value,
        //                codigo = a.codigo,
        //                descripcion = a.descripcion,
        //                fechaCre = a.fechaCreacion.Value,
        //                fechaMod = a.fechaMod.Value,
        //                idInternal = a.idInternal,
        //                idPadre = a.idPadre.Value,
        //                idunidad = a.idunidad.Value,
        //                unidad = a.InsumoUnidad.abreviacion,
        //                empleadoCre = a.Empleado.descripcion,
        //                empleadoMod = a.Empleado1.descripcion,
        //                insumoPadre = c.descripcion,
        //                codigoPadre = c.codigo,
        //                idTipoInsumo=a.idTipoInsumo,
        //                cuenta = a.cuenta
        //            };

        //    return q.ToList();

          

        //}



      










        #region "get Control insumoList"


        int _count;
        public int Count(string descripion,int idInsumoList,  int startRowIndex, int maximumRows, string sortExpression)
        {
            return _count;
        }

        private IQueryable<InsumoListInfo> ApplySort(IQueryable<InsumoListInfo> q, string sortExpression)
        {
            switch (sortExpression)
            {
                case "codigo":
                    q = q.OrderBy(b => b.codigo);
                    break;
                case "codigo DESC":
                    q = q.OrderByDescending(b => b.codigo);
                    break;
                case "descripcion":
                    q = q.OrderBy(b => b.descripcion);
                    break;
                case "descripcion DESC":
                    q = q.OrderByDescending(b => b.descripcion);
                    break;
                case "codigoPadre":
                    q = q.OrderBy(b => b.codigoPadre);
                    break;
                case "codigoPadre DESC":
                    q = q.OrderByDescending(b => b.codigoPadre);
                    break;

                case "insumoPadre":
                    q = q.OrderBy(b => b.insumoPadre);
                    break;
                case "insumoPadre DESC":
                    q = q.OrderByDescending(b => b.insumoPadre);
                    break;


                case "unidad":
                    q = q.OrderBy(b => b.unidad);
                    break;
                case "unidad DESC":
                    q = q.OrderByDescending(b => b.unidad);
                    break;


                case "cuenta":
                    q = q.OrderBy(b => b.cuenta);
                    break;
                case "cuenta DESC":
                    q = q.OrderByDescending(b => b.cuenta);
                    break;
                case "bitRec":
                    q = q.OrderBy(b => b.bitRec);
                    break;
                case "bitRec DESC":
                    q = q.OrderByDescending(b => b.bitRec);
                    break;

            }
            return q;
        }


       


        [DataObjectMethod(DataObjectMethodType.Select, false)]
        public List<InsumoListInfo> GetInsumoList(string descripion, int idInsumoList, int startRowIndex, int maximumRows, string sortExpression)
        {
            if (!descripion.HasValue())
                descripion = "";

          List<InsumoListInfo> lista= new List<InsumoListInfo>() ;
            if (idInsumoList==-3)
            {        // clases por tipinsumo
                   var  q = from a in DbUtil.Db.Insumos
                            join b in DbUtil.Db.Insumos on a.idPadre equals b.idInternal into viewinsumo
                            from c in viewinsumo.DefaultIfEmpty()
                            where a.nivel == 0
                             & (a.codigo + a.descripcion).Contains(descripion) 
                            orderby a.codigo
                            select new InsumoListInfo
                            {
                                bitControlStock = a.bitControlStock,
                                bitRec = a.bitRec,
                                codigo = a.codigo,
                                descripcion = a.descripcion,
                                fechaCre = a.fechaCreacion.Value,
                                fechaMod = a.fechaMod.Value,
                                idInternal = a.idInternal,
                                idPadre = a.idPadre.Value,
                                idunidad = a.idunidad.Value,
                                unidad = a.InsumoUnidad.abreviacion,
                                empleadoCre = a.Empleado.descripcion,
                                empleadoMod = a.Empleado1.descripcion,
                                insumoPadre = c.descripcion,
                                codigoPadre = c.codigo,
                                idTipoInsumo = a.idTipoInsumo,
                                cuenta = a.cuenta
                            };
                    _count = q.Count();
                    q = ApplySort(q, sortExpression);
                lista= q.Skip(startRowIndex).Take(maximumRows).ToList();
            }
           if (idInsumoList==-2)
            {
                    // Familia por tipiinsumo
                   var  q= from a in DbUtil.Db.Insumos
                             join b in DbUtil.Db.Insumos on a.idPadre equals b.idInternal into viewinsumo
                             from c in viewinsumo.DefaultIfEmpty()
                             where a.nivel == 1
                             & (a.codigo + a.descripcion).Contains(descripion)
                           
                             orderby a.codigo
                             select new InsumoListInfo
                             {
                                 bitControlStock = a.bitControlStock,
                                 bitRec = a.bitRec,
                                 codigo = a.codigo,
                                 descripcion = a.descripcion,
                                 fechaCre = a.fechaCreacion.Value,
                                 fechaMod = a.fechaMod.Value,
                                 idInternal = a.idInternal,
                                 idPadre = a.idPadre.Value,
                                 idunidad = a.idunidad.Value,
                                 unidad = a.InsumoUnidad.abreviacion,
                                 empleadoCre = a.Empleado.descripcion,
                                 empleadoMod = a.Empleado1.descripcion,
                                 insumoPadre = c.descripcion,
                                 codigoPadre = c.codigo,
                                 idTipoInsumo = a.idTipoInsumo,
                                 cuenta = a.cuenta
                             };
                    _count = q.Count();
                    q = ApplySort(q, sortExpression);
                   lista= q.Skip(startRowIndex).Take(maximumRows).ToList();
            }
           if (idInsumoList==-1)
            {
                    // subFamilia por tipiinsumo
                    var q = from a in DbUtil.Db.Insumos
                             join b in DbUtil.Db.Insumos on a.idPadre equals b.idInternal into viewinsumo
                             from c in viewinsumo.DefaultIfEmpty()
                             where a.nivel == 2
                             & (a.codigo + a.descripcion).Contains(descripion)
                            
                             orderby a.codigo
                             select new InsumoListInfo
                             {
                                 bitControlStock = a.bitControlStock,
                                 bitRec = a.bitRec,
                                 codigo = a.codigo,
                                 descripcion = a.descripcion,
                                 fechaCre = a.fechaCreacion.Value,
                                 fechaMod = a.fechaMod.Value,
                                 idInternal = a.idInternal,
                                 idPadre = a.idPadre.Value,
                                 idunidad = a.idunidad.Value,
                                 unidad = a.InsumoUnidad.abreviacion,
                                 empleadoCre = a.Empleado.descripcion,
                                 empleadoMod = a.Empleado1.descripcion,
                                 insumoPadre = c.descripcion,
                                 codigoPadre = c.codigo,
                                 idTipoInsumo = a.idTipoInsumo,
                                 cuenta = a.cuenta
                             };
                    _count = q.Count();
                    q = ApplySort(q, sortExpression);
                 
                   lista= q.Skip(startRowIndex).Take(maximumRows).ToList();
            }
           if (idInsumoList==0)
            {
                    // insumo por tipiinsumo
                     var q = from a in DbUtil.Db.Insumos
                             join b in DbUtil.Db.Insumos on a.idPadre equals b.idInternal into viewinsumo
                             from c in viewinsumo.DefaultIfEmpty()
                             where a.nivel == 3
                             & (a.codigo + a.descripcion).Contains(descripion)
                          
                             orderby a.codigo
                             select new InsumoListInfo
                             {
                                 bitControlStock = a.bitControlStock,
                                 bitRec = a.bitRec,
                                 codigo = a.codigo,
                                 descripcion = a.descripcion,
                                 fechaCre = a.fechaCreacion.Value,
                                 fechaMod = a.fechaMod.Value,
                                 idInternal = a.idInternal,
                                 idPadre = a.idPadre.Value,
                                 idunidad = a.idunidad.Value,
                                 unidad = a.InsumoUnidad.abreviacion,
                                 empleadoCre = a.Empleado.descripcion,
                                 empleadoMod = a.Empleado1.descripcion,
                                 insumoPadre = c.descripcion,
                                 codigoPadre = c.codigo,
                                 idTipoInsumo = a.idTipoInsumo,
                                 cuenta = a.cuenta
                             };
                    _count = q.Count();
                    q = ApplySort(q, sortExpression);
                    lista= q.Skip(startRowIndex).Take(maximumRows).ToList();
            }

           return lista;
        }


     




        #endregion




        #region "get Control InsumoCompraInfo"



        public int Count(int idInsumo, int startRowIndex, int maximumRows, string sortExpression)
        {
            return _count;
        }

        private IQueryable<InsumoCompraInfo> ApplySort(IQueryable<InsumoCompraInfo> q, string sortExpression)
        {
            switch (sortExpression)
            {
                case "fecha":
                    q = q.OrderBy(b => b.fecha);
                    break;
                case "fecha DESC":
                    q = q.OrderByDescending(b => b.fecha);
                    break;
                case "obra":
                    q = q.OrderBy(b => b.obra);
                    break;
                case "obra DESC":
                    q = q.OrderByDescending(b => b.obra);
                    break;
                case "ordenCompra":
                    q = q.OrderBy(b => b.ordenCompra);
                    break;
                case "ordenCompra DESC":
                    q = q.OrderByDescending(b => b.ordenCompra);
                    break;

                case "precio":
                    q = q.OrderBy(b => b.precio);
                    break;
                case "precio DESC":
                    q = q.OrderByDescending(b => b.precio);
                    break;


                case "proveedor":
                    q = q.OrderBy(b => b.proveedor);
                    break;
                case "proveedor DESC":
                    q = q.OrderByDescending(b => b.proveedor);
                    break;
                default:
                    q = q.OrderByDescending(b => b.fecha);
                    break;


            }
            return q;
        }



        //[DataObjectMethod(DataObjectMethodType.Select, false)]
        //public List<InsumoCompraInfo> GetInsumoComprasList(int idInsumo, int startRowIndex, int maximumRows, string sortExpression)
        //{
        //    List<InsumoCompraInfo> lista = new List<InsumoCompraInfo>();

        //              var q= from a in DbUtil.Db.OrdenCompraItems
        //                     where a.idInsumo==idInsumo &
        //                     a.bitActivo==true
        //                     select new InsumoCompraInfo
        //                     {
        //                         fecha=a.OrdenCompra.fechaEmision.Value,
        //                         fechaStr=a.OrdenCompra.fechaEmision.Value.ToShortDateString(),
        //                         idInternal=a.OrdenCompra.idInternal,
        //                         idObra=a.OrdenCompra.idObra.Value,
        //                         obra=a.OrdenCompra.Obra.descripcion,
        //                         ordenCompra=a.OrdenCompra.numDocumento,
        //                         precio=a.precioNoIGV.Value,
        //                         preciostr=String.Format("{0} {1:N}",a.OrdenCompra.Moneda1.simbol,a.precioNoIGV.Value),
        //                         proveedor=a.OrdenCompra.proveedor
        //                     };


        //        _count = q.Count();

        //        q = ApplySort(q, sortExpression);

        //        return  q.Skip(startRowIndex).Take(maximumRows).ToList();

         

        //}

        
        #endregion






  //      public void mantenimietoRecurso()
  //{

  //    var q= from a in DbUtil.Db.ultimoscodigos
  //           select a;

  //    foreach (var item in q)
  //    {
          
      
  //    Insumo insumo = this.getInsumoFromCodigo(item.descripcion, item.codigo);
  //    InsumoUnidad insumoUnidad = this.getInsumoUnidadFromAbrev(item.unidad.Trim());
  //        dbGestionDataContext _db= new dbGestionDataContext(Parametros.strConnString);
  //           if (insumo == null)
  //                {
  //                    //buscamos el valor de idunidad


  //                    if (insumoUnidad == null)
  //                    {
  //                        // registramos el valor de 
  //                        insumoUnidad = new InsumoUnidad();
  //                        insumoUnidad.add(DbUtil.Db,
  //                                   item.unidad,
  //                                   item.unidad);

  //                    }
  //                    insumo = new Insumo();
  //                    insumo.Add(DbUtil.Db,
  //                        item.codigo,
  //                        item.descripcion,
  //                        insumoUnidad.idInternal,
  //                        2,
  //                       8555,
  //                        1);
  //                    // creamos la tarea  para el empleado

  //                    TaskEmpleado emplo = new TaskEmpleado();
  //                    String nota = string.Format("Verificar Insumos nuevos registrados del presupuesto:{0}", insumo.codigo);
  //                    emplo.Add(DbUtil.Db,
  //                        1,
  //                        nota,
  //                        nota,
  //                        31,
  //                        1);
  //                }
                      
     
  //}


  


  

  //  }

        //public void updatecodigo()
        //{
        //    var q = from a in DAL.DbUtil.Db.insumoupdatecodigos
        //            select a;

        //    foreach (var item in q)
        //    {

        //        Recurso rec = DAL.DbUtil.Db.Recursos.Where(p => p.idInsumo == item.idInsumo).First();
                
        //        Insumo insummo = DAL.DbUtil.Db.Insumo.Single(p => p.idInternal == item.idInsumo);
        //        insummo.codigo = rec.codigo;
        //        DAL.DbUtil.Db.SubmitChanges();

        //    }
        //}

        



    //    public void updateIDInsumo()    {

    //        var q = from a in DbUtil.Db.OrdenCompraItems
    //                where a.idInsumo==null
    //                select a
    //                ;

    //        foreach (var item in q)
    //        {
    //            int idInsumo = DbUtil.Db.ComparativoItemSelecPrv.
    //                Single(p => p.idInternal == item.idComparativoItemSelecPrv).ComparativoItem.EstructuraCostoItem.idInsumo.Value;

                        
    //                item.idInsumo = idInsumo;
    //                item.cantidadRecep = 0;
    //                DbUtil.Db.SubmitChanges();
                
    //                //if (qq.idInternal != 2610)
    //                //{
    //                //    item.idInsumo = qq.idInternal;
    //                //    DbUtil.Db.SubmitChanges();
    //                //}
          
                
    //        }

    //}




        //public void importExcelClase(string archivo)
        //{

        //    Microsoft.Office.Interop.Excel.Application xlsApp = new Microsoft.Office.Interop.Excel.Application();
        //    Microsoft.Office.Interop.Excel.Workbook wbPresupuesto;
        //    Microsoft.Office.Interop.Excel.Worksheet wsPresupuesto;



        //    //string local = Parametros.ubicacionServerLocal;
        //    //string directorioArchivo = local + String.Format("\\{0}\\{1}", dbpres.idObra, dbpres.archivo);
           
        //    //// ingreso depuracion
        //    string ruta = String.Format("C:\\Desarrollo Web\\EOMGestionUlt\\EOMGestionUlt\\Datos\\{0}",archivo);
        //    String directorioArchivo = ruta;

            
           

        //    wbPresupuesto = xlsApp.Workbooks.Open(directorioArchivo);

        //    wsPresupuesto =
        //            (Microsoft.Office.Interop.Excel.Worksheet)wbPresupuesto.ActiveSheet;

        //        bool FinArchivo = false;
        //    int numeroCelda = 1;
        //    int condadorVacio = 1;
        //    int cursor = 0;
        //    string celdaValor = "";
             

        //    try
        //    {

        //        while (!FinArchivo)
        //        {
        //            cursor++;
        //            celdaValor = this.ReadCelda(ref wsPresupuesto, "A" + cursor);

        //            if (celdaValor != "")
        //            {
        //                insumoFinal nuevoInsumo = new insumoFinal();
        //                nuevoInsumo.codigo = this.ReadCelda(ref wsPresupuesto, "A" + cursor);
        //                nuevoInsumo.descripcion = this.ReadCelda(ref wsPresupuesto, "B" + cursor);
        //                nuevoInsumo.cuenta = this.ReadCelda(ref wsPresupuesto, "C" + cursor);
        //                nuevoInsumo.bitRec = true;
        //                nuevoInsumo.fechaCreacion = DateTime.Now;
        //                nuevoInsumo.fechaMod = DateTime.Now;
        //                nuevoInsumo.usuarioCre = 1;
        //                nuevoInsumo.usuarioMod = 1;
        //                nuevoInsumo.idTipoInsumo = 1;
        //                nuevoInsumo.nivel = 0;
        //                DbUtil.Db.insumoFinals.InsertOnSubmit(nuevoInsumo);
        //                numeroCelda++;
        //                //carga de la clase
        //            }
        //            else
        //                condadorVacio++;

        //            if (condadorVacio == 15)
        //            {
        //                break;
        //            }
        //        }
        //        DbUtil.Db.SubmitChanges();
                    
        //    }

        //    catch (Exception ex)
        //    {
                
        //        xlsApp.ActiveWorkbook.Close(true, directorioArchivo, Type.Missing);
        //        throw new Exception(ex.Message + "Ruta:" + directorioArchivo + "celda:" + celdaValor);
        //    }
        //    finally
        //    {
        //        xlsApp.ActiveWorkbook.Close(true, directorioArchivo, Type.Missing);
        //        xlsApp.Quit();
        //        xlsApp = null;
        //    }
        //}

        //public void importExcelFamilia(string archivo)
        //{

        //    Microsoft.Office.Interop.Excel.Application xlsApp = new Microsoft.Office.Interop.Excel.Application();
        //    Microsoft.Office.Interop.Excel.Workbook wbPresupuesto;
        //    Microsoft.Office.Interop.Excel.Worksheet wsPresupuesto;



        //    //string local = Parametros.ubicacionServerLocal;
        //    //string directorioArchivo = local + String.Format("\\{0}\\{1}", dbpres.idObra, dbpres.archivo);

        //    //// ingreso depuracion
        //    string ruta = String.Format("C:\\Desarrollo Web\\EOMGestionUlt\\EOMGestionUlt\\Datos\\{0}", archivo);
        //    String directorioArchivo = ruta;




        //    wbPresupuesto = xlsApp.Workbooks.Open(directorioArchivo);

        //    wsPresupuesto =
        //            (Microsoft.Office.Interop.Excel.Worksheet)wbPresupuesto.ActiveSheet;

        //    bool FinArchivo = false;
        //    int numeroCelda = 1;
        //    int condadorVacio = 1;
        //    int cursor = 0;
        //    string celdaValor = "";


        //    try
        //    {

        //        while (!FinArchivo)
        //        {
        //            cursor++;
        //            celdaValor = this.ReadCelda(ref wsPresupuesto, "A" + cursor);

        //            if (celdaValor != "")
        //            {
        //                insumoFinal nuevoInsumo = new insumoFinal();
        //                nuevoInsumo.codigo = this.ReadCelda(ref wsPresupuesto, "A" + cursor);
        //                nuevoInsumo.descripcion = this.ReadCelda(ref wsPresupuesto, "B" + cursor);
        //                nuevoInsumo.cuenta = this.ReadCelda(ref wsPresupuesto, "C" + cursor);
        //                string codpadre = this.ReadCelda(ref wsPresupuesto, "D" + cursor);

        //                //buscamos padre
        //                nuevoInsumo.idPadre= DbUtil.Db.insumoFinals.Single(p => p.codigo.Trim() == codpadre).idInternal;
        //                nuevoInsumo.bitRec = true;
        //                nuevoInsumo.fechaCreacion = DateTime.Now;
        //                nuevoInsumo.fechaMod = DateTime.Now;
        //                nuevoInsumo.usuarioCre = 1;
        //                nuevoInsumo.usuarioMod = 1;
        //                nuevoInsumo.idTipoInsumo = 1;
        //                nuevoInsumo.nivel = 1;
        //                DbUtil.Db.insumoFinals.InsertOnSubmit(nuevoInsumo);
        //                numeroCelda++;
        //                //carga de la clase
        //            }
        //            else
        //                condadorVacio++;

        //            if (condadorVacio == 15)
        //            {
        //                break;
        //            }
        //        }
        //        DbUtil.Db.SubmitChanges();

        //    }

        //    catch (Exception ex)
        //    {

        //        xlsApp.ActiveWorkbook.Close(true, directorioArchivo, Type.Missing);
        //        throw new Exception(ex.Message + "Ruta:" + directorioArchivo + "celda:" + celdaValor);
        //    }
        //    finally
        //    {
        //        xlsApp.ActiveWorkbook.Close(true, directorioArchivo, Type.Missing);
        //        xlsApp.Quit();
        //        xlsApp = null;
        //    }
        //}


        //public void importExcelSubFamilia(string archivo)
        //{

        //    Microsoft.Office.Interop.Excel.Application xlsApp = new Microsoft.Office.Interop.Excel.Application();
        //    Microsoft.Office.Interop.Excel.Workbook wbPresupuesto;
        //    Microsoft.Office.Interop.Excel.Worksheet wsPresupuesto;



        //    //string local = Parametros.ubicacionServerLocal;
        //    //string directorioArchivo = local + String.Format("\\{0}\\{1}", dbpres.idObra, dbpres.archivo);

        //    //// ingreso depuracion
        //    string ruta = String.Format("C:\\Desarrollo Web\\EOMGestionUlt\\EOMGestionUlt\\Datos\\{0}", archivo);
        //    String directorioArchivo = ruta;




        //    wbPresupuesto = xlsApp.Workbooks.Open(directorioArchivo);

        //    wsPresupuesto =
        //            (Microsoft.Office.Interop.Excel.Worksheet)wbPresupuesto.ActiveSheet;

        //    bool FinArchivo = false;
        //    int numeroCelda = 1;
        //    int condadorVacio = 1;
        //    int cursor = 0;
        //    string celdaValor = "";


        //    try
        //    {

        //        while (!FinArchivo)
        //        {
        //            cursor++;
        //            celdaValor = this.ReadCelda(ref wsPresupuesto, "A" + cursor);

        //            if (celdaValor != "")
        //            {
        //                insumoFinal nuevoInsumo = new insumoFinal();
        //                nuevoInsumo.codigo = this.ReadCelda(ref wsPresupuesto, "A" + cursor);
        //                nuevoInsumo.descripcion = this.ReadCelda(ref wsPresupuesto, "B" + cursor);
        //                nuevoInsumo.cuenta = this.ReadCelda(ref wsPresupuesto, "C" + cursor);
        //                string codpadre = this.ReadCelda(ref wsPresupuesto, "D" + cursor);

        //                //buscamos padre
        //                nuevoInsumo.idPadre = DbUtil.Db.insumoFinals.Single(p => p.codigo.Trim() == codpadre).idInternal;
        //                nuevoInsumo.bitRec = true;
        //                nuevoInsumo.fechaCreacion = DateTime.Now;
        //                nuevoInsumo.fechaMod = DateTime.Now;
        //                nuevoInsumo.usuarioCre = 1;
        //                nuevoInsumo.usuarioMod = 1;
        //                nuevoInsumo.idTipoInsumo = 1;
        //                nuevoInsumo.nivel = 2;
        //                DbUtil.Db.insumoFinals.InsertOnSubmit(nuevoInsumo);
        //                numeroCelda++;
        //                //carga de la clase
        //            }
        //            else
        //                condadorVacio++;

        //            if (condadorVacio == 15)
        //            {
        //                break;
        //            }
        //        }
        //        DbUtil.Db.SubmitChanges();

        //    }

        //    catch (Exception ex)
        //    {

        //        xlsApp.ActiveWorkbook.Close(true, directorioArchivo, Type.Missing);
        //        throw new Exception(ex.Message + "Ruta:" + directorioArchivo + "celda:" + celdaValor);
        //    }
        //    finally
        //    {
        //        xlsApp.ActiveWorkbook.Close(true, directorioArchivo, Type.Missing);
        //        xlsApp.Quit();
        //        xlsApp = null;
        //    }
        //}

        //public void importExcelInsumo(string archivo)
        //{

        //    Microsoft.Office.Interop.Excel.Application xlsApp = new Microsoft.Office.Interop.Excel.Application();
        //    Microsoft.Office.Interop.Excel.Workbook wbPresupuesto;
        //    Microsoft.Office.Interop.Excel.Worksheet wsPresupuesto;



        //    //string local = Parametros.ubicacionServerLocal;
        //    //string directorioArchivo = local + String.Format("\\{0}\\{1}", dbpres.idObra, dbpres.archivo);

        //    //// ingreso depuracion
        //    string ruta = String.Format("C:\\Desarrollo Web\\EOMGestionUlt\\EOMGestionUlt\\Datos\\{0}", archivo);
        //    String directorioArchivo = ruta;




        //    wbPresupuesto = xlsApp.Workbooks.Open(directorioArchivo);

        //    wsPresupuesto =
        //            (Microsoft.Office.Interop.Excel.Worksheet)wbPresupuesto.ActiveSheet;

        //    bool FinArchivo = false;
        //    int numeroCelda = 1;
        //    int condadorVacio = 1;
        //    int cursor = 0;
        //    string celdaValor = "";


        //    try
        //    {
        //        using(TransactionScope ts= new TransactionScope())
        //        {
        //            dbGestionDataContext _db = new dbGestionDataContext(Parametros.strConnString);
        //        while (!FinArchivo)
        //        {
        //            cursor++;
        //            celdaValor = this.ReadCelda(ref wsPresupuesto, "A" + cursor);

        //            if (celdaValor != "")
        //            {
        //                insumoFinal nuevoInsumo = new insumoFinal();
        //                nuevoInsumo.codigo = this.ReadCelda(ref wsPresupuesto, "A" + cursor);
        //                nuevoInsumo.descripcion = this.ReadCelda(ref wsPresupuesto, "B" + cursor);
        //                nuevoInsumo.cuenta = "";
                        
        //                string codpadre = this.ReadCelda(ref wsPresupuesto, "D" + cursor);

        //                //buscamos padre
        //                insumoFinal padre = _db.insumoFinals.Single(p => p.descripcion.Trim() == codpadre & p.nivel == 2);
                       
        //                nuevoInsumo.idPadre = padre.idInternal;
        //                nuevoInsumo.codigo = nuevoInsumo.getCorrelativo(_db, padre.codigo, 1, 3);
        //                nuevoInsumo.idunidad = int.Parse(this.ReadCelda(ref wsPresupuesto, "E" + cursor));
        //                nuevoInsumo.idAnterior = int.Parse(this.ReadCelda(ref wsPresupuesto, "F" + cursor));
        //                nuevoInsumo.codS10=this.ReadCelda(ref wsPresupuesto, "G" + cursor);
        //                nuevoInsumo.bitRec = true;
        //                nuevoInsumo.bitControlStock = false;

        //                nuevoInsumo.fechaCreacion = DateTime.Now;
        //                nuevoInsumo.fechaMod = DateTime.Now;
        //                nuevoInsumo.usuarioCre = 1;
        //                nuevoInsumo.usuarioMod = 1;
        //                nuevoInsumo.idTipoInsumo = 1;
        //                nuevoInsumo.nivel = 3;
        //                _db.insumoFinals.InsertOnSubmit(nuevoInsumo);
        //                _db.SubmitChanges();
        //                numeroCelda++;
        //                //if (numeroCelda == 1000)
        //                //{
        //                //    numeroCelda = 0;
        //                //    ts.Complete();
        //                //}

        //                //carga de la clase
        //            }
        //            else
        //                condadorVacio++;

        //            if (condadorVacio == 15)
        //            {
        //                break;
        //            }
        //        }
        //        ts.Complete();
        //    }
            
        //    }

        //    catch (Exception ex)
        //    {
                
        //        xlsApp.ActiveWorkbook.Close(true, directorioArchivo, Type.Missing);
        //        throw new Exception(ex.Message + "Ruta:" + directorioArchivo + "celda:" + celdaValor);
        //    }
        //    finally
        //    {
        //        xlsApp.ActiveWorkbook.Close(true, directorioArchivo, Type.Missing);
        //        xlsApp.Quit();
        //        xlsApp = null;
        //    }
        //}


        //public void importExcelInsumo99999(string archivo)
        //{

        //    Microsoft.Office.Interop.Excel.Application xlsApp = new Microsoft.Office.Interop.Excel.Application();
        //    Microsoft.Office.Interop.Excel.Workbook wbPresupuesto;
        //    Microsoft.Office.Interop.Excel.Worksheet wsPresupuesto;



        //    //string local = Parametros.ubicacionServerLocal;
        //    //string directorioArchivo = local + String.Format("\\{0}\\{1}", dbpres.idObra, dbpres.archivo);

        //    //// ingreso depuracion
        //    string ruta = String.Format("C:\\Desarrollo Web\\EOMGestionUlt\\EOMGestionUlt\\Datos\\{0}", archivo);
        //    String directorioArchivo = ruta;




        //    wbPresupuesto = xlsApp.Workbooks.Open(directorioArchivo);

        //    wsPresupuesto =
        //            (Microsoft.Office.Interop.Excel.Worksheet)wbPresupuesto.ActiveSheet;

        //    bool FinArchivo = false;
        //    int numeroCelda = 1;
        //    int condadorVacio = 1;
        //    int cursor = 0;
        //    string celdaValor = "";


        //    try
        //    {
        //        using (TransactionScope ts = new TransactionScope())
        //        {
        //            dbGestionDataContext _db = new dbGestionDataContext(Parametros.strConnString);
        //            while (!FinArchivo)
        //            {
        //                cursor++;
        //                celdaValor = this.ReadCelda(ref wsPresupuesto, "A" + cursor);

        //                if (celdaValor != "")
        //                {
        //                    Insumo nuevoInsumo = new Insumo();
        //                    nuevoInsumo.codigo = this.ReadCelda(ref wsPresupuesto, "A" + cursor);
        //                    nuevoInsumo.descripcion = this.ReadCelda(ref wsPresupuesto, "B" + cursor);
        //                    nuevoInsumo.cuenta = "";

        //                    //string codpadre = this.ReadCelda(ref wsPresupuesto, "D" + cursor);

        //                    ////buscamos padre
        //                    //insumoFinal padre = _db.insumoFinals.Single(p => p.descripcion.Trim() == codpadre & p.nivel == 2);

        //                    nuevoInsumo.idPadre = 5571;
        //                    nuevoInsumo.codigo = nuevoInsumo.getCorrelativo(_db, "999999", 3);
        //                    nuevoInsumo.idunidad = int.Parse(this.ReadCelda(ref wsPresupuesto, "E" + cursor));
        //                    nuevoInsumo.codS10 = this.ReadCelda(ref wsPresupuesto, "F" + cursor);
        //                    nuevoInsumo.bitRec = true;
        //                    nuevoInsumo.bitControlStock = false;

        //                    nuevoInsumo.fechaCreacion = DateTime.Now;
        //                    nuevoInsumo.fechaMod = DateTime.Now;
        //                    nuevoInsumo.usuarioCre = 1;
        //                    nuevoInsumo.usuarioMod = 1;
        //                    nuevoInsumo.idTipoInsumo = 1;
        //                    nuevoInsumo.nivel = 3;
        //                    _db.Insumos.InsertOnSubmit(nuevoInsumo);
        //                    _db.SubmitChanges();
        //                    numeroCelda++;
        //                    //if (numeroCelda == 1000)
        //                    //{
        //                    //    numeroCelda = 0;
        //                    //    ts.Complete();
        //                    //}

        //                    //carga de la clase
        //                }
        //                else
        //                    condadorVacio++;

        //                if (condadorVacio == 15)
        //                {
        //                    break;
        //                }
        //            }
        //            ts.Complete();
        //        }

        //    }

        //    catch (Exception ex)
        //    {

        //        xlsApp.ActiveWorkbook.Close(true, directorioArchivo, Type.Missing);
        //        throw new Exception(ex.Message + "Ruta:" + directorioArchivo + "celda:" + celdaValor);
        //    }
        //    finally
        //    {
        //        xlsApp.ActiveWorkbook.Close(true, directorioArchivo, Type.Missing);
        //        xlsApp.Quit();
        //        xlsApp = null;
        //    }
        //}



        public void actualizaOrdenCompra()
        {
            try
            {

                //using (TransactionScope ts = new TransactionScope())
                //{
                    var q = from a in DbUtil.Db.OrdenCompraItems
                            select a;

                    foreach (var item in q)
                    {
                        
                        var qq= from a in DbUtil.Db.EstructuraCostoItems
                               where  a.idInternal==item.ComparativoItemSelecPrv.ComparativoItem.EstructuraCostoItem.idInternal
                               select a;


                        if (qq.Count() != 1)
                        {
                            item.idInsumo = null;
                        }
                        else
                        {
                            item.idInsumo = qq.First().idInsumo;
                        }
                        
                        
                    }
                    DbUtil.Db.SubmitChanges();
                //    ts.Complete();
                //}
            }

            catch (Exception ex)
            {

                throw new Exception(ex.Message);
            }
        }




        //[DataObjectMethod(DataObjectMethodType.Select, false)]
        //public List<view_Recurso> getRecursosPresupuestoList(int idObra, int idPresupuesto, int idGrupo)
        //{
            
        //        Presupuesto presu = DbUtil.Db.Presupuesto.Single(p => p.idInternal == idPresupuesto);
        //        RecursoListInfo e = new RecursoListInfo();
        //    e.
        //        if (presu.tipoOrigen == 2)
        //        {
        //            var q = from i in DbUtil.Db.view_Recursos
        //                    where ((i.parcial - i.parcialUso) > 0) & i.idObra == idObra
        //                    & i.idPresupuesto == idPresupuesto &
        //                    i.bitsel == true
        //                    select i;
        //            return q.ToList();

        //        }
        //        else
        //        {
        //            var q = from i in DbUtil.Db.view_Recursos
        //                    where ((i.parcial - i.parcialUso) > 0) & i.idObra == idObra
        //                    & i.idPresupuesto == idPresupuesto &
        //                    i.bitsel == true & i.grupo == idGrupo
        //                    select i;

        //            return q.ToList();

        //        }



            
        //}


    }

    
}
